diff --git a/user_guide/nav/hacks.txt b/user_guide/nav/hacks.txt
index f29e5a7..081eece 100644
--- a/user_guide/nav/hacks.txt
+++ b/user_guide/nav/hacks.txt
@@ -1,9 +1,9 @@
-I did the following hack in moo.fx.js:
-
-At line 79 in the toggle: function()  function, I added:
-
-document.getElementById('nav').style.display = 'block';
-
-
-
+I did the following hack in moo.fx.js:
+
+At line 79 in the toggle: function()  function, I added:
+
+document.getElementById('nav').style.display = 'block';
+
+
+
 -- Rick Ellis
\ No newline at end of file
diff --git a/user_guide/nav/prototype.lite.js b/user_guide/nav/prototype.lite.js
index e6c3622..d294fd7 100755
--- a/user_guide/nav/prototype.lite.js
+++ b/user_guide/nav/prototype.lite.js
@@ -1,127 +1,127 @@
-/*  Prototype JavaScript framework
- *  (c) 2005 Sam Stephenson <sam@conio.net>
- *
- *  Prototype is freely distributable under the terms of an MIT-style license.
- *
- *  For details, see the Prototype web site: http://prototype.conio.net/
- *
-/*--------------------------------------------------------------------------*/
-
-
-//note: this is a stripped down version of prototype, to be used with moo.fx by mad4milk (http://moofx.mad4milk.net).
-
-var Class = {
-  create: function() {
-	return function() {
-	  this.initialize.apply(this, arguments);
-	}
-  }
-}
-
-Object.extend = function(destination, source) {
-  for (property in source) {
-	destination[property] = source[property];
-  }
-  return destination;
-}
-
-Function.prototype.bind = function(object) {
-  var __method = this;
-  return function() {
-	return __method.apply(object, arguments);
-  }
-}
-
-function $() {
-  var elements = new Array();
-
-  for (var i = 0; i < arguments.length; i++) {
-	var element = arguments[i];
-	if (typeof element == 'string')
-	  element = document.getElementById(element);
-
-	if (arguments.length == 1)
-	  return element;
-
-	elements.push(element);
-  }
-
-  return elements;
-}
-
-//-------------------------
-
-document.getElementsByClassName = function(className) {
-  var children = document.getElementsByTagName('*') || document.all;
-  var elements = new Array();
-
-  for (var i = 0; i < children.length; i++) {
-	var child = children[i];
-	var classNames = child.className.split(' ');
-	for (var j = 0; j < classNames.length; j++) {
-	  if (classNames[j] == className) {
-		elements.push(child);
-		break;
-	  }
-	}
-  }
-
-  return elements;
-}
-
-//-------------------------
-
-if (!window.Element) {
-  var Element = new Object();
-}
-
-Object.extend(Element, {
-  remove: function(element) {
-	element = $(element);
-	element.parentNode.removeChild(element);
-  },
-
-  hasClassName: function(element, className) {
-	element = $(element);
-	if (!element)
-	  return;
-	var a = element.className.split(' ');
-	for (var i = 0; i < a.length; i++) {
-	  if (a[i] == className)
-		return true;
-	}
-	return false;
-  },
-
-  addClassName: function(element, className) {
-	element = $(element);
-	Element.removeClassName(element, className);
-	element.className += ' ' + className;
-  },
-
-  removeClassName: function(element, className) {
-	element = $(element);
-	if (!element)
-	  return;
-	var newClassName = '';
-	var a = element.className.split(' ');
-	for (var i = 0; i < a.length; i++) {
-	  if (a[i] != className) {
-		if (i > 0)
-		  newClassName += ' ';
-		newClassName += a[i];
-	  }
-	}
-	element.className = newClassName;
-  },
-
-  // removes whitespace-only text node children
-  cleanWhitespace: function(element) {
-	element = $(element);
-	for (var i = 0; i < element.childNodes.length; i++) {
-	  var node = element.childNodes[i];
-	  if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
-		Element.remove(node);
-	}
-  }
+/*  Prototype JavaScript framework
+ *  (c) 2005 Sam Stephenson <sam@conio.net>
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+
+//note: this is a stripped down version of prototype, to be used with moo.fx by mad4milk (http://moofx.mad4milk.net).
+
+var Class = {
+  create: function() {
+	return function() {
+	  this.initialize.apply(this, arguments);
+	}
+  }
+}
+
+Object.extend = function(destination, source) {
+  for (property in source) {
+	destination[property] = source[property];
+  }
+  return destination;
+}
+
+Function.prototype.bind = function(object) {
+  var __method = this;
+  return function() {
+	return __method.apply(object, arguments);
+  }
+}
+
+function $() {
+  var elements = new Array();
+
+  for (var i = 0; i < arguments.length; i++) {
+	var element = arguments[i];
+	if (typeof element == 'string')
+	  element = document.getElementById(element);
+
+	if (arguments.length == 1)
+	  return element;
+
+	elements.push(element);
+  }
+
+  return elements;
+}
+
+//-------------------------
+
+document.getElementsByClassName = function(className) {
+  var children = document.getElementsByTagName('*') || document.all;
+  var elements = new Array();
+
+  for (var i = 0; i < children.length; i++) {
+	var child = children[i];
+	var classNames = child.className.split(' ');
+	for (var j = 0; j < classNames.length; j++) {
+	  if (classNames[j] == className) {
+		elements.push(child);
+		break;
+	  }
+	}
+  }
+
+  return elements;
+}
+
+//-------------------------
+
+if (!window.Element) {
+  var Element = new Object();
+}
+
+Object.extend(Element, {
+  remove: function(element) {
+	element = $(element);
+	element.parentNode.removeChild(element);
+  },
+
+  hasClassName: function(element, className) {
+	element = $(element);
+	if (!element)
+	  return;
+	var a = element.className.split(' ');
+	for (var i = 0; i < a.length; i++) {
+	  if (a[i] == className)
+		return true;
+	}
+	return false;
+  },
+
+  addClassName: function(element, className) {
+	element = $(element);
+	Element.removeClassName(element, className);
+	element.className += ' ' + className;
+  },
+
+  removeClassName: function(element, className) {
+	element = $(element);
+	if (!element)
+	  return;
+	var newClassName = '';
+	var a = element.className.split(' ');
+	for (var i = 0; i < a.length; i++) {
+	  if (a[i] != className) {
+		if (i > 0)
+		  newClassName += ' ';
+		newClassName += a[i];
+	  }
+	}
+	element.className = newClassName;
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+	element = $(element);
+	for (var i = 0; i < element.childNodes.length; i++) {
+	  var node = element.childNodes[i];
+	  if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+		Element.remove(node);
+	}
+  }
 });
\ No newline at end of file
